//
//  HMOAuthViewController.swift
//  SinaWeibo
//
//  Created by apple on 16/9/25.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
import SVProgressHUD

//访问控制
/*
  public(公有的) ,internal(无论在本类还是分类中都可以访问), fileprivate(只是在当前文件中私有), private(绝对的私有, 在分类中都无法访问)
 */

class HMOAuthViewController: UIViewController {
    
    internal
    
    lazy var webView = UIWebView()
    override func loadView() {
        
        //解决webView没有数据的时候底部的黑条
        //isOpaque 不透明的
        webView.isOpaque = false
        view = webView
        //设置代理
        webView.delegate = self
        //设置背景颜色
        view.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
        setNavBar()
        
        //加载授权页面
        loadOAuthPage()
    }
    
    //设置导航条
    private func setNavBar() {
        //图片名称不能够传空字符串 不然会有警告 Cactlog UI
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "关闭", target: self, action: #selector(close))
        
        //上线的时候一定要注意将方法 注销掉
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "自动填充", target: self, action: #selector(fillAccount))
    }
    
    @objc private func fillAccount() {
        //webView执行js
        let jsString = "document.getElementById('userId').value = 'leiggee@126.com', document.getElementById('passwd').value = 'onoyomg' "
        webView.stringByEvaluatingJavaScript(from: jsString)
    }
    
    //按钮的监听事件
    @objc private func close() {
        //实现dismiss
        dismiss(animated: true, completion: nil)
    }
    
    private func loadOAuthPage() {
        
        let urlString = "https://api.weibo.com/oauth2/authorize?" + "client_id=" + client_id + "&redirect_uri=" + redirect_uri
        let url = URL(string: urlString)
        let req = URLRequest(url: url!)
        //加载页面
        webView.loadRequest(req)
        //演示用的
        //loadAccessToken()
    }

    
}

//swift中 推荐协议方法在扩展中实现 extension
//这个扩展就是用来专门实现 代理方法的
extension HMOAuthViewController: UIWebViewDelegate {
    //实现协议方法
    func webViewDidStartLoad(_ webView: UIWebView) {
        //开始加载页面
        //显示等待指示器
        SVProgressHUD.show()
    }
    
    func webViewDidFinishLoad(_ webView: UIWebView) {
        //加载完成
        //关闭等待指示器
        SVProgressHUD.dismiss()
    }
    
    
    //网页每次加载新的页面实际上都是重写发送了request 在该方法中就可以拦截该请求
    //该协议方法的返回值是bool类型 如果返回true 该空间可以正常使用否则就不能够正常
    //js  -> 调用本地代码: 点击webView内的一个元素 --> 发起request, 包含url --> 截取url中的特殊的标记  -> 拦截 跳转本地页面
    //本地调用 js:  利用这个方法stringByEvaluatingJavaScript
    //其他高级功能就可以使用框架 javaScripCore
    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        
        //截取重定向url中的code
        //绝对路径 url对象的 Sting 形式
        let urlStirng = request.url?.absoluteString ?? ""
        
        //如果urlStirng 中包含了 重定向地址 就认为授权成功 就可以开始 截取code
        let flag = "code="
        if urlStirng.contains(flag) {
            //只完成截取code操作
            //http://www.itheima.com/?code=71e33a0143d3ea89c189513cac17b594
            
            //获取url的参数部分
            let query = request.url?.query ?? ""
            let code = (query as NSString).substring(from: flag.characters.count)
            
            //利用code 请求token
            //成功了之后需要加载itheima.com
            //控制器关注请求的状态  成功还是失败
            HMUserAccountViewModel.sharedAccountViewModel.loadAccessToken(code: code, finished: { (success) in
                //如果失败
                if !success {
                    SVProgressHUD.showError(withStatus: errorTip)
                    return
                }
                //如果成功
                print("登录获取用信息成功")
                //modal 一个欢迎页面的控制器控制器
                //不建议使用modal的方式切换视图控制器  而是应该切换根视图控制器
                //也不建议使用者者两种方式切换
                //UIApplication.shared.delegate?.window?.rootViewController =
                //UIApplication.shared.keyWindow?.rootViewController
                //表示哪个对象发出的通知 一般用这个参数来传递参数
                NotificationCenter.default.post(name: NSNotification.Name(KchangeRootViewController), object: "Welcome")
                
            })
            return false
        }
        return true
    }
 
}





